home *** CD-ROM | disk | FTP | other *** search
/ Developer CD Series 1995…tember: Reference Library / Dev.CD Sep 95 RL / Dev.CD Sep 95 RL.toast / mac / Technical Documentation / develop / develop Issue 23 code / ProjectDrag 1.1b4 / Sources / ProjectDrag Sources / ExternalCheckIn.c < prev    next >
Encoding:
C/C++ Source or Header  |  1995-07-12  |  5.7 KB  |  250 lines  |  [TEXT/MPS ]

  1. /* ExternalCheckIn.c: External CheckIn applet for ProjectDrag
  2.  *
  3.  * A set of applets for drag and drop source control by Tim Maroney.
  4.  * See develop, issue 23 for details.
  5.  *
  6.  * Built on DropShell by Leonard Rosenthol, Stephan Somogyi, and Marshall Clow,
  7.  * and using the MoreFiles utilities by Jim Luther.
  8.  *
  9.  * This software is free, but don't modify and redistribute it without
  10.  * changing the status window to indicate your name and your changes!
  11.  */
  12.  
  13.  
  14. #include <Errors.h>
  15. #include <StandardFile.h>
  16.  
  17. #include "DSUserProcs.h"
  18. #include "SourceServer.h"
  19. #include "PDUtilities.h"
  20. #include "PDDialogs.h"
  21. #include "Comments.h"
  22. #include "TasksAndErrors.h"
  23. #include "FileCopy.h"
  24.  
  25.  
  26. void ExternalCheckInFile(FSSpec *file);
  27.  
  28.  
  29. /* This routine is called for each file passed in the ODOC event. */
  30.  
  31. pascal void OpenDoc ( FSSpecPtr myFSSPtr, Boolean opening, Handle userDataHandle )
  32. {
  33. #pragma unused ( opening )
  34. #pragma unused ( userDataHandle )
  35.  
  36.     ExternalCheckInFile(myFSSPtr);
  37. }
  38.  
  39.  
  40.  
  41. /* filter files based on file name */
  42.  
  43. pascal Boolean FindTargetFileFilter(CInfoPBPtr pb, Ptr myDataPtr)
  44. {
  45.     StringPtr fileName = myDataPtr;
  46.     /* XXX make sure it has a CKID */
  47.     return !EqualString(fileName, pb->hFileInfo.ioNamePtr, false, false);
  48. }
  49.  
  50.  
  51. void ExternalCheckInFile(FSSpec *file)
  52. {
  53.     Str63 userName;
  54.     Str15 nickname;
  55.     Str255 comment;
  56.     AEDesc command;
  57.     Str255 projectName;
  58.     OSErr err;
  59.     CKIDHandle theCKID;
  60.     FSSpec targetFile;
  61.     FSSpec targetFolder;
  62.         
  63.     TaskStart(2001, 1, file->name, NULL, NULL, NULL); /* checking in */
  64.     
  65.     /* find the user name and initials */
  66.     err = GetUserSettings(userName, nickname, false);
  67.     if (err != noErr)
  68.     {
  69.         gDone = true;
  70.         return;
  71.     }
  72.     
  73.     /* get the target file with Standard File */
  74.     {
  75.         StandardFileReply reply;
  76.         Str255 prompt;
  77.         Point where;
  78.         OSErr err;
  79.         FInfo info;
  80.         
  81.         /* must be the same type */
  82.         err = FSpGetFInfo(file, &info);
  83.         if (err != noErr)
  84.         {
  85.             RaiseErrorNumber(err);
  86.             return;
  87.         }
  88.         
  89.         SetPt(&where, -1, -1);
  90.         ReplaceInIndString(prompt, 2002, 1, file->name, NULL, NULL, NULL);
  91.         ParamText(prompt, NULL, NULL, NULL);
  92.         CustomGetFile (FindTargetFileFilter, 1, &info.fdType, &reply, kSelectWithPromptDialog, where,
  93.                         NULL, NULL, NULL, NULL, file->name);
  94.         if (!reply.sfGood)
  95.         {
  96.             RaiseErrorNumber(userCanceledErr);
  97.             return;
  98.         }
  99.         targetFile = reply.sfFile;
  100.     }
  101.  
  102.     /* get the CKID */
  103.     err = ExtractCKID(&targetFile, &theCKID);
  104.     if (err != noErr)
  105.     {
  106.         RaiseErrorNumber(err);
  107.         return;
  108.     }
  109.     
  110.     /* mount the project */
  111.     err = MountProjectFromCKID(theCKID, projectName);
  112.     if (err != noErr)
  113.     {
  114.         DisposeHandle((Handle)theCKID);
  115.         return;
  116.     }
  117.  
  118.     /* Make sure the file is writeable. */
  119.     if (!(*theCKID)->writeable && !(*theCKID)->modifyReadOnly)
  120.     {
  121.         /* check out the file -- XXX -- ask about discarding changes */
  122.         TaskStart(2001, 2, file->name, NULL, NULL, NULL); /* checking out */
  123.     
  124.         /* create a CheckOut -m command for SourceServer
  125.          * CheckOut -m -cs <comment> -d <dir> -project <project> -u <user> <file>
  126.          */
  127.         err = CreateCommand(&command, "CheckOut");
  128.         if (err == noErr)
  129.             err = AddCStringArg(&command, "-m");
  130.         if (err == noErr)
  131.             err = AddCommentArg(&command, comment);
  132.         if (err == noErr)
  133.             err = AddDirArg(&command, targetFile.vRefNum, targetFile.parID);
  134.         if (err == noErr)
  135.             err = AddProjectArg(&command, projectName);
  136.         if (err == noErr)
  137.             err = AddUserArg(&command, userName);
  138.         if (err == noErr)
  139.             err = AddPStringArg(&command, targetFile.name);
  140.         if (err != noErr)
  141.         {
  142.             AEDisposeDesc(&command);
  143.             RaiseErrorNumber(err);
  144.             return;
  145.         }
  146.         
  147.         err = SendCommand(&command);        /* send the command to SourceServer */
  148.         if (err != noErr) return;
  149.         TaskDone();
  150.         
  151.         /* refetch the CKID */
  152.         DisposeHandle((Handle)theCKID);
  153.         theCKID = NULL;
  154.         err = ExtractCKID(&targetFile, &theCKID);
  155.         if (err != noErr)
  156.         {
  157.             RaiseErrorNumber(err);
  158.             return;
  159.         }
  160.     }
  161.     
  162.     /* copy or move the external file in place of the target */
  163.     TaskStart(2001, 3, file->name, NULL, NULL, NULL); /* copying */
  164.     err = FSpDelete(&targetFile);
  165.     if (err != noErr)
  166.     {
  167.         DisposeHandle((Handle)theCKID);
  168.         RaiseErrorNumber(err);
  169.         return;
  170.     }
  171.     targetFolder = targetFile;
  172.     targetFolder.name[0] = 0;
  173.     err = FSpFileCopy(file, &targetFolder, NULL, NULL, 0, true);
  174.     if (err != noErr)
  175.     {
  176.         DisposeHandle((Handle)theCKID);
  177.         RaiseErrorNumber(err);
  178.         return;
  179.     }
  180.     TaskDone();
  181.     
  182.     /* transfer the CKID into the (new) target file */
  183.     {
  184.         /* open the resource file */
  185.         CKIDHandle zapCKID;
  186.         short refNum = FSpOpenResFile(&targetFile, fsRdWrPerm);
  187.         if (refNum < 0)
  188.         {
  189.             DisposeHandle((Handle)theCKID);
  190.             RaiseErrorNumber(ResError());
  191.             return;
  192.         }
  193.         
  194.         /* get the CKID from it and delete it (if any) */
  195.         zapCKID = (CKIDHandle) Get1IndResource('ckid', 1);
  196.         if (zapCKID != NULL)
  197.             RemoveResource((Handle)zapCKID);
  198.         
  199.         /* add the CKID */
  200.         AddResource((Handle)theCKID, 'ckid', 128, "\p");
  201.         err = ResError();
  202.         if (err != noErr)
  203.         {
  204.             CloseResFile(refNum);
  205.             RaiseErrorNumber(err);
  206.             return;
  207.         }
  208.         
  209.         /* close the resource file */
  210.         CloseResFile(refNum);
  211.     }
  212.         
  213.     /* add the change comment to the file header */
  214.     comment[0] = 0;
  215.     err = AddCheckinComment(file, userName, nickname, comment);
  216.     if (err != noErr) return;
  217.     
  218.     /* create a CheckIn command for SourceServer
  219.      * CheckIn -cs <comment> -project <project> -u <user> <file>
  220.      */
  221.     err = CreateCommand(&command, "CheckIn");
  222.     if (err == noErr)
  223.         err = AddCommentArg(&command, comment);
  224.     if (err == noErr)
  225.         err = AddProjectArg(&command, projectName);
  226.     if (err == noErr)
  227.         err = AddUserArg(&command, userName);
  228.     if (err == noErr)
  229.         err = AddFileNameArg(&command, &targetFile);
  230.     if (err != noErr)
  231.     {
  232.         AEDisposeDesc(&command);
  233.         RaiseErrorNumber(err);
  234.         return;
  235.     }
  236.     
  237.     err = SendCommand(&command);        /* send the command to SourceServer */
  238.     if (err == noErr)
  239.         TaskDone();
  240. }
  241.  
  242.  
  243. void DoFileMenu(short itemID)
  244. {
  245.     if ( itemID == 1 )
  246.         SelectFile();        // call file selection userProc
  247.     else
  248.         SendQuitToSelf();    // send self a 'quit' event
  249. }
  250.